如何在自訂類別(Class)中 Dispose時,清除所有的 Event | 您所在的位置:网站首页 › class 802 › 如何在自訂類別(Class)中 Dispose時,清除所有的 Event |
感謝各位版大,能檢視我所遇到的問題, 希望有經驗的版大,能指點一二。 .Net 版本:4.0 語言:C# 簡述: 我在自訂一個Class,裡面寫了自訂的Event,以供外部使用(+=)。 我希望能在Dispose時,將這些Evnet清空(-=),以確保物件參考能被釋放,並避免不預期的Event Handle被執行; 當然,我拿不到 Event Handle 的函數名稱(因為是外 部加掛的函數),更何況那可能是匿名函數。 程式碼:(已將無關的Code移除,僅留Event與IDisposable的部份) public class UITabOrderAgent:IDisposable //←自訂的Class { public class FinishedOrderArgs : EventArgs { } public delegate void FinishedOrderEventHandler(object sender, FinishedOrderArgs e); public event FinishedOrderEventHandler FinishedOrder; private void OnFinishedOrder(FinishedOrderArgs e) { FinishedOrderEventHandler handler = FinishedOrder; //所掛事件觸發 if (handler != null) { handler(this, e); } }
private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { // this.FinishedOrder -= XXX; // ↑ 我希望在這行清空所有Evnet Handle } disposed = true; } } ~UITabOrderAgent() { Dispose(false); } public void Dispose() { Dispose(true); } } ------------------------------------------------------------- public class Form1 : Form //←使用的Form { private UITabOrderAgent ResetOrderAgent; private void ResetOrderAgent() //重設 UITabOrderAgent,視使用者的操作,此方法可能在Form的生命週期中執行多次 { ………// 一些判斷式,用來決定參數 UIs 的內容 if (UITabOrderAgent!=null) UITabOrderAgent.Dispose() //捨棄舊物件 UITabOrderAgent=new UITabOrderAgent(UIs);//指向新的物件 UITabOrderAgent.FinishedOrder += (object sender, UITabOrderAgent.FinishedOrderArgs e) => { ......//一些動作 }; } } --------------------------------------------------------------------- 我理解『誰開的資源,誰要負責關』的程式原則, 但我還是希望能簡化 工具Class 的使用方式, 甚至希望設計成 使用者忘了寫 Dispose 時,也不會有嚴重的後遺症, 請各位版大指點一二,感激不盡。 |
CopyRight 2018-2019 实验室设备网 版权所有 |